这题蛮有意思的,虽然叫 md5 calculator,但是跟md5算法没什么关系,主要考查的是伪随机。
1 | int my_hash() |
在my_hash函数中,将canary也放进去计算了,而srand()的种子用的是time(0),而tmie(0)函数返回的时间是以秒为单位的,所以时间一样我们就知道了种子,再结合my_hash,即可算出canary
1 | unsigned int process_hash() |
再看process_hash函数,Base64Decode会把g_buf字符串解码,并放到v3中去,由于输入的最大长度为1024,解码后的最大长度就是1024*3/4=768,而变量v3只有512,所以这里可以溢出。结合my_hash中得到的canary即可控制程序流。
网速会影响随机数的计算,所以可以将exp放到pwnable.kr服务器上运行。
1 | #coding:utf-8 |